04_TOPIC MODELLING_with LDA¶

Цель¶

  • провести topic modelling c LDA (Latent Dirichlet Allocation) с метрикой coherence score

Imports¶

In [1]:
import os
import pandas as pd
import matplotlib.pyplot as plt
import warnings
from pathlib import Path
import logging

import pyLDAvis
import pyLDAvis.gensim_models as gensimvis

from wordcloud import WordCloud

Initialization¶

In [2]:
pd.set_option("display.max_colwidth", None)

plt.style.use("classic")
# Ignore UserWarning specifically
warnings.filterwarnings("ignore", category=UserWarning)
In [3]:
PROJECT_NAME = "finam_topic_modelling"
FILE_INPUT_NAME = "data_with_k_means.parquet"

# Get the current working directory
current_dir = Path.cwd()


# Traverse up to find "finam_text_classification" folder
project_root = current_dir
while project_root.name != PROJECT_NAME:
    if project_root.parent == project_root:  # Reached the filesystem root
        raise FileNotFoundError("The 'finam_text_classification' folder was not found.")
    project_root = project_root.parent

# Define the path to the input data relative to the project root
PTH_TO_INPUT_DATA = project_root / "data" / "interim" / FILE_INPUT_NAME

Defs¶

In [4]:
def lda_model_gensim(corpus, dictionary, num_topics):
    from gensim import models

    ldamodel = models.ldamodel.LdaModel(corpus, id2word=dictionary, eval_every=20, num_topics=num_topics, passes=5)
    return ldamodel
In [5]:
def topic_file(topics_gensim_np, file_pth):
    list_topic = []
    for ind_topiс, topiс in enumerate(topics_gensim_np):
        list_word = topiс[1]
        for words in list_word:
            topic_word = []
            topic_word.append(ind_topiс)
            topic_word.append(words[0])
            topic_word.append(words[1])
            list_topic.append(topic_word)
    topic_gensim = pd.DataFrame(list_topic, columns=["topic", "word_in topic", "weight_topic"])
    topic_gensim.to_parquet(file_pth, index=False)
    return topic_gensim
In [6]:
# облако слов топиков для модели gensim
def plotWordCloud(topic_number, topics, head):
    """
    Строит визуализацию слов на основе текстов топиков из Gensim
    """
    # получаем частоты и слова топика
    text = dict(topics[topic_number][1])
    # print(head+str(topic_number))
    # строим облако слов
    wordcloud = WordCloud(background_color="white", max_words=100, width=900, height=900, collocations=False)
    wordcloud = wordcloud.generate_from_frequencies(text)
    #    wordcloud.generate(long_string)
    plt.figure(figsize=(15, 10))
    plt.title((head + " номер {}").format(topic_number))
    plt.imshow(wordcloud, interpolation="bilinear")
    plt.axis("off")
In [7]:
def get_topic(words, lda):
    """ """
    bag = lda.id2word.doc2bow(words)
    topics = lda.get_document_topics(bag)
    topic_dictionary = {}
    for topic in topics:
        topic_dictionary[topic[1]] = str((topic[0]))
    main_probability = max(topic_dictionary)
    main_topic = topic_dictionary[main_probability]
    return [main_topic, main_probability]

Main pipeline¶

Read data¶

In [8]:
# Read data
try:
    # Use Path to check if the file exists
    if PTH_TO_INPUT_DATA.exists():
        # Read the Excel file
        df_init = pd.read_parquet(PTH_TO_INPUT_DATA)
        logging.info("File successfully loaded.")
    else:
        # Log an error if the file is not found
        logging.error(f"File not found: {PTH_TO_INPUT_DATA}")
except Exception as e:
    # Log any exceptions that occur
    logging.error(f"An error occurred: {e}")
In [9]:
df_init[["normalized_review_text"]].head(3).T
Out[9]:
0 1 2
normalized_review_text элегантный отель центр <loc> красивый стильный номер жуткий цена посещение отель рекомендоваться ограбить банк неожиданно разбогатеть это писать набрать <num> символ стиль ваш поездка <loc> это шопинг <loc> молл созерцание фонтан гастрономический ужин пожалеть деньга усилить весь ощущение номер вид фонтан отель <org> это просто супер номер находиться нижний этаж <loc> поэтому вид фонтан оттуда точно хороший улица около хороший крыша это замечательный здание ресторан общий самый хороший прямо будильник заводить выходить смотреть фонтан балкон представление меняться течение вечер балкон курить мочь радовать расстаться привычка номер продавать сайт отель перекупщик тип <misc> номер увидеть реально работать удобный функциональный умный дом управление весь электроника номер <misc> дизайн просто привлекательный интересный очень функциональный сервис честные <num> <misc> мальчик этаж любой вопрос решаться моментально весь очень быстро ненавязчиво шопинг <loc> молл идти галерея ребята сотрудник отель помочь понести сумка отель отнести бояться доверять ценный груз смотровой площадка билет продаваться очередь прямо отель попасть <num> пройти галерея туда обратно контроль безопасность находиться сторона <loc> молл <loc> найти придраться весь вкусно сервис прекрасный общий вывод оказаться <loc> транзит вариант снова сюда провести супруг уик енд <loc> самый люкс вид фонтан весь уровень отличный панорамный вид фонтан номер шикарный просторный стильный весь чувствоваться качество люкс номер бесплатно предоставить бентли водитель завтрак отличный безупречный спа прекрасный фитнес общий недостаток кроме отель городской море рядом маленький бассейн

Make ls from normalized words¶

In [10]:
df_init["ls_normalized_text"] = df_init["normalized_review_text"].apply(lambda x: x.split())
df_init[["ls_normalized_text"]].head(3)
Out[10]:
ls_normalized_text
0 [элегантный, отель, центр, <loc>, красивый, стильный, номер, жуткий, цена, посещение, отель, рекомендоваться, ограбить, банк, неожиданно, разбогатеть, это, писать, набрать, <num>, символ]
1 [стиль, ваш, поездка, <loc>, это, шопинг, <loc>, молл, созерцание, фонтан, гастрономический, ужин, пожалеть, деньга, усилить, весь, ощущение, номер, вид, фонтан, отель, <org>, это, просто, супер, номер, находиться, нижний, этаж, <loc>, поэтому, вид, фонтан, оттуда, точно, хороший, улица, около, хороший, крыша, это, замечательный, здание, ресторан, общий, самый, хороший, прямо, будильник, заводить, выходить, смотреть, фонтан, балкон, представление, меняться, течение, вечер, балкон, курить, мочь, радовать, расстаться, привычка, номер, продавать, сайт, отель, перекупщик, тип, <misc>, номер, увидеть, реально, работать, удобный, функциональный, умный, дом, управление, весь, электроника, номер, <misc>, дизайн, просто, привлекательный, интересный, очень, функциональный, сервис, честные, <num>, <misc>, мальчик, этаж, любой, вопрос, решаться, моментально, ...]
2 [провести, супруг, уик, енд, <loc>, самый, люкс, вид, фонтан, весь, уровень, отличный, панорамный, вид, фонтан, номер, шикарный, просторный, стильный, весь, чувствоваться, качество, люкс, номер, бесплатно, предоставить, бентли, водитель, завтрак, отличный, безупречный, спа, прекрасный, фитнес, общий, недостаток, кроме, отель, городской, море, рядом, маленький, бассейн]

Using BOW with gensim¶

In [11]:
import gensim
from gensim import corpora, models
In [12]:
type(df_init["ls_normalized_text"].values)
Out[12]:
numpy.ndarray
In [13]:
dictionary = gensim.corpora.Dictionary(df_init["ls_normalized_text"].values)  # составляем словарь из терминов
print("Размер словаря до фильтрации: {}".format(len(dictionary)))
Размер словаря до фильтрации: 18650
In [14]:
dictionary.filter_extremes(no_below=3, no_above=0.4, keep_n=3 * 10**6)  # практически не фильтрует
dictionary.compactify()  # reassign id
print("Размер словаря после фильтрации: {}".format(len(dictionary)))
Размер словаря после фильтрации: 6975
In [15]:
print(dictionary)
Dictionary<6975 unique tokens: ['банк', 'жуткий', 'красивый', 'набрать', 'неожиданно']...>
In [16]:
corpus = [dictionary.doc2bow(text) for text in df_init["ls_normalized_text"]]
type(corpus), corpus[1:3]
Out[16]:
(list,
 [[(12, 3),
   (13, 1),
   (14, 2),
   (15, 1),
   (16, 1),
   (17, 1),
   (18, 1),
   (19, 1),
   (20, 1),
   (21, 1),
   (22, 1),
   (23, 2),
   (24, 1),
   (25, 1),
   (26, 1),
   (27, 1),
   (28, 2),
   (29, 1),
   (30, 1),
   (31, 1),
   (32, 1),
   (33, 1),
   (34, 1),
   (35, 1),
   (36, 1),
   (37, 1),
   (38, 1),
   (39, 1),
   (40, 1),
   (41, 1),
   (42, 1),
   (43, 1),
   (44, 3),
   (45, 1),
   (46, 1),
   (47, 1),
   (48, 2),
   (49, 1),
   (50, 1),
   (51, 1),
   (52, 2),
   (53, 1),
   (54, 1),
   (55, 1),
   (56, 1),
   (57, 1),
   (58, 1),
   (59, 1),
   (60, 1),
   (61, 1),
   (62, 1),
   (63, 1),
   (64, 1),
   (65, 1),
   (66, 1),
   (67, 1),
   (68, 1),
   (69, 1),
   (70, 1),
   (71, 1),
   (72, 1),
   (73, 1),
   (74, 2),
   (75, 2),
   (76, 1),
   (77, 1),
   (78, 1),
   (79, 1),
   (80, 1),
   (81, 1),
   (82, 1),
   (83, 1),
   (84, 2),
   (85, 1),
   (86, 1),
   (87, 1),
   (88, 1),
   (89, 1),
   (90, 1),
   (91, 1),
   (92, 1),
   (93, 1),
   (94, 1),
   (95, 1),
   (96, 1),
   (97, 1),
   (98, 1),
   (99, 1),
   (100, 1),
   (101, 1),
   (102, 1),
   (103, 1),
   (104, 1),
   (105, 1),
   (106, 4),
   (107, 2),
   (108, 3),
   (109, 1),
   (110, 2),
   (111, 1),
   (112, 2)],
  [(8, 1),
   (23, 2),
   (52, 1),
   (67, 1),
   (83, 1),
   (106, 2),
   (113, 1),
   (114, 1),
   (115, 1),
   (116, 1),
   (117, 1),
   (118, 1),
   (119, 1),
   (120, 1),
   (121, 2),
   (122, 1),
   (123, 1),
   (124, 1),
   (125, 2),
   (126, 1),
   (127, 1),
   (128, 1),
   (129, 1),
   (130, 1),
   (131, 1),
   (132, 1),
   (133, 1),
   (134, 1),
   (135, 1),
   (136, 1),
   (137, 1)]])

Bi-Gram BOW with gensim¶

In [ ]:
texts = df_init["ls_normalized_text"]

# 1. Создаем биграммы


bigram = models.Phrases(texts, min_count=3, threshold=5)  # Обучает биграммы


bigram_phraser = models.phrases.Phraser(bigram)  # Применяет биграммы к предложению

# 2. Применяем биграммы к текстам
bigram_texts = [bigram_phraser[sent] for sent in texts]

# 3. Создаем триграммы на основе биграммного текста
trigram = models.Phrases(bigram_texts, min_count=2, threshold=5)
trigram_phraser = models.phrases.Phraser(trigram)

# 4. Применяем триграммы
trigram_texts = [trigram_phraser[sent] for sent in bigram_texts]


bigram_dict = corpora.Dictionary(bigram_texts)  # составляем словарь из терминов с учетом биграмм слов предлжений


print("Размер словаря до фильтрации: {}".format(len(bigram_dict)))

trigram_dict = corpora.Dictionary(trigram_texts)  # составляем словарь из терминов с учетом биграмм слов предлжений
print("Размер словаря до фильтрации: {}".format(len(trigram_dict)))
Размер словаря до фильтрации: 22921
Размер словаря до фильтрации: 26774
In [18]:
bigram_texts[:3]
Out[18]:
[['элегантный',
  'отель',
  'центр',
  '<loc>',
  'красивый_стильный',
  'номер',
  'жуткий',
  'цена',
  'посещение',
  'отель',
  'рекомендоваться',
  'ограбить',
  'банк',
  'неожиданно',
  'разбогатеть',
  'это',
  'писать',
  'набрать',
  '<num>_символ'],
 ['стиль',
  'ваш',
  'поездка',
  '<loc>',
  'это',
  'шопинг',
  '<loc>_молл',
  'созерцание',
  'фонтан',
  'гастрономический',
  'ужин',
  'пожалеть',
  'деньга',
  'усилить',
  'весь',
  'ощущение',
  'номер',
  'вид',
  'фонтан',
  'отель',
  '<org>',
  'это',
  'просто_супер',
  'номер',
  'находиться',
  'нижний_этаж',
  '<loc>',
  'поэтому',
  'вид',
  'фонтан',
  'оттуда',
  'точно',
  'хороший',
  'улица',
  'около',
  'хороший',
  'крыша',
  'это',
  'замечательный',
  'здание',
  'ресторан',
  'общий',
  'самый_хороший',
  'прямо',
  'будильник',
  'заводить',
  'выходить',
  'смотреть',
  'фонтан',
  'балкон',
  'представление',
  'меняться',
  'течение',
  'вечер',
  'балкон',
  'курить',
  'мочь_радовать',
  'расстаться',
  'привычка',
  'номер',
  'продавать',
  'сайт',
  'отель',
  'перекупщик',
  'тип',
  '<misc>',
  'номер',
  'увидеть',
  'реально',
  'работать',
  'удобный_функциональный',
  'умный_дом',
  'управление',
  'весь',
  'электроника',
  'номер',
  '<misc>',
  'дизайн',
  'просто',
  'привлекательный',
  'интересный',
  'очень',
  'функциональный',
  'сервис',
  'честные',
  '<num>',
  '<misc>',
  'мальчик',
  'этаж',
  'любой_вопрос',
  'решаться',
  'моментально',
  'весь',
  'очень',
  'быстро',
  'ненавязчиво',
  'шопинг',
  '<loc>_молл',
  'идти',
  'галерея',
  'ребята',
  'сотрудник',
  'отель',
  'помочь',
  'понести',
  'сумка',
  'отель',
  'отнести',
  'бояться',
  'доверять',
  'ценный',
  'груз',
  'смотровой_площадка',
  'билет',
  'продаваться',
  'очередь',
  'прямо',
  'отель',
  'попасть',
  '<num>',
  'пройти',
  'галерея',
  'туда_обратно',
  'контроль',
  'безопасность',
  'находиться',
  'сторона',
  '<loc>_молл',
  '<loc>',
  'найти',
  'придраться',
  'весь',
  'вкусно',
  'сервис',
  'прекрасный',
  'общий_вывод',
  'оказаться',
  '<loc>',
  'транзит',
  'вариант',
  'снова',
  'сюда'],
 ['провести',
  'супруг',
  'уик',
  'енд',
  '<loc>',
  'самый',
  'люкс',
  'вид',
  'фонтан',
  'весь',
  'уровень',
  'отличный',
  'панорамный_вид',
  'фонтан',
  'номер',
  'шикарный',
  'просторный',
  'стильный',
  'весь',
  'чувствоваться',
  'качество',
  'люкс',
  'номер',
  'бесплатно_предоставить',
  'бентли',
  'водитель',
  'завтрак',
  'отличный',
  'безупречный',
  'спа',
  'прекрасный',
  'фитнес',
  'общий',
  'недостаток',
  'кроме',
  'отель',
  'городской',
  'море',
  'рядом',
  'маленький',
  'бассейн']]
In [19]:
trigram_texts[:3]
Out[19]:
[['элегантный',
  'отель',
  'центр_<loc>',
  'красивый_стильный',
  'номер',
  'жуткий',
  'цена',
  'посещение',
  'отель',
  'рекомендоваться',
  'ограбить',
  'банк',
  'неожиданно',
  'разбогатеть',
  'это',
  'писать',
  'набрать',
  '<num>_символ'],
 ['стиль',
  'ваш',
  'поездка',
  '<loc>',
  'это',
  'шопинг',
  '<loc>_молл',
  'созерцание',
  'фонтан',
  'гастрономический',
  'ужин',
  'пожалеть',
  'деньга',
  'усилить',
  'весь',
  'ощущение',
  'номер',
  'вид_фонтан',
  'отель',
  '<org>',
  'это',
  'просто_супер',
  'номер',
  'находиться',
  'нижний_этаж',
  '<loc>',
  'поэтому',
  'вид_фонтан',
  'оттуда',
  'точно',
  'хороший',
  'улица',
  'около',
  'хороший',
  'крыша',
  'это',
  'замечательный',
  'здание',
  'ресторан',
  'общий',
  'самый_хороший',
  'прямо',
  'будильник',
  'заводить',
  'выходить',
  'смотреть',
  'фонтан',
  'балкон',
  'представление',
  'меняться',
  'течение',
  'вечер',
  'балкон_курить',
  'мочь_радовать',
  'расстаться',
  'привычка',
  'номер',
  'продавать',
  'сайт_отель',
  'перекупщик',
  'тип',
  '<misc>',
  'номер',
  'увидеть',
  'реально',
  'работать',
  'удобный_функциональный',
  'умный_дом',
  'управление',
  'весь',
  'электроника',
  'номер',
  '<misc>',
  'дизайн',
  'просто',
  'привлекательный',
  'интересный',
  'очень',
  'функциональный',
  'сервис',
  'честные',
  '<num>',
  '<misc>',
  'мальчик',
  'этаж',
  'любой_вопрос',
  'решаться',
  'моментально',
  'весь',
  'очень_быстро',
  'ненавязчиво',
  'шопинг',
  '<loc>_молл',
  'идти',
  'галерея',
  'ребята',
  'сотрудник_отель',
  'помочь',
  'понести',
  'сумка',
  'отель',
  'отнести',
  'бояться',
  'доверять',
  'ценный',
  'груз',
  'смотровой_площадка',
  'билет',
  'продаваться',
  'очередь',
  'прямо',
  'отель',
  'попасть',
  '<num>',
  'пройти',
  'галерея',
  'туда_обратно',
  'контроль',
  'безопасность',
  'находиться',
  'сторона',
  '<loc>_молл',
  '<loc>',
  'найти',
  'придраться',
  'весь_вкусно',
  'сервис',
  'прекрасный',
  'общий_вывод',
  'оказаться',
  '<loc>',
  'транзит',
  'вариант',
  'снова',
  'сюда'],
 ['провести',
  'супруг',
  'уик',
  'енд',
  '<loc>',
  'самый',
  'люкс',
  'вид_фонтан',
  'весь',
  'уровень',
  'отличный',
  'панорамный_вид',
  'фонтан',
  'номер',
  'шикарный',
  'просторный',
  'стильный',
  'весь',
  'чувствоваться',
  'качество',
  'люкс',
  'номер',
  'бесплатно_предоставить',
  'бентли',
  'водитель',
  'завтрак',
  'отличный',
  'безупречный',
  'спа',
  'прекрасный',
  'фитнес',
  'общий',
  'недостаток',
  'кроме',
  'отель',
  'городской',
  'море',
  'рядом',
  'маленький',
  'бассейн']]
In [20]:
bigram_dict.filter_extremes(no_below=3, no_above=0.4, keep_n=3 * 10**6)
print("Размер словаря после фильтрации: {}".format(len(bigram_dict)))

trigram_dict.filter_extremes(no_below=3, no_above=0.4, keep_n=3 * 10**6)
print("Размер словаря после фильтрации: {}".format(len(trigram_dict)))
Размер словаря после фильтрации: 10908
Размер словаря после фильтрации: 14181
In [21]:
corpus_bi = [
    bigram_dict.doc2bow(text) for text in bigram_texts
]  # составляем корпус документов по словарю полученному с использованием биграмм

corpus_tri = [
    trigram_dict.doc2bow(text) for text in trigram_texts
]  # составляем корпус документов по словарю полученному с использованием биграмм
In [22]:
print(dictionary)
print(bigram_dict)
print(trigram_dict)
Dictionary<6975 unique tokens: ['банк', 'жуткий', 'красивый', 'набрать', 'неожиданно']...>
Dictionary<10908 unique tokens: ['<num>_символ', 'банк', 'жуткий', 'красивый_стильный', 'набрать']...>
Dictionary<14181 unique tokens: ['<num>_символ', 'банк', 'жуткий', 'красивый_стильный', 'набрать']...>

Топики на основании модели Latent Dirichlet allocation (LDA)¶

In [23]:
import numpy as np
from gensim.models import LdaModel, CoherenceModel
from tqdm import tqdm

coherence_values = []
best_model = None
best_coherence = -np.inf
best_number_of_topics = None

topic_range = range(2, 8, 1)

for num_topics in tqdm(topic_range):
    model = LdaModel(
        corpus=corpus,
        num_topics=num_topics,
        id2word=dictionary,
        passes=5,  # More passes improve topic coherence
        random_state=42,
    )  # Train LDA model

    coherencemodel = CoherenceModel(model=model, texts=texts, dictionary=dictionary, coherence="c_v")

    coherence_values.append(coherencemodel.get_coherence())

    if coherence_values[-1] > best_coherence:
        best_coherence = coherence_values[-1]
        best_model = model
        best_number_of_topics = num_topics

# Plot the coherence scores
plt.figure(figsize=(8, 5))
plt.plot(topic_range, coherence_values, marker="o", label="c")
plt.xlabel("Number of Topics")
plt.ylabel("Coherence score")
plt.legend()
plt.show()

print(f"Best number of topics: {best_number_of_topics}")
100%|██████████| 6/6 [02:04<00:00, 20.78s/it]
No description has been provided for this image
Best number of topics: 4
In [29]:
import numpy as np
from gensim.models import LdaModel, CoherenceModel
from tqdm import tqdm

coherence_values = []
best_model = None
best_coherence = -np.inf
best_number_of_topics = None

topic_range = range(2, 8, 1)

for num_topics in tqdm(topic_range):
    model = LdaModel(
        corpus=corpus_bi,
        num_topics=num_topics,
        id2word=bigram_dict,
        passes=5,  # More passes improve topic coherence
        random_state=42,
    )  # Train LDA model

    coherencemodel = CoherenceModel(model=model, texts=bigram_texts, dictionary=bigram_dict, coherence="c_v")

    coherence_values.append(coherencemodel.get_coherence())

    if coherence_values[-1] > best_coherence:
        best_coherence = coherence_values[-1]
        best_model = model
        best_number_of_topics = num_topics

# Plot the coherence scores
plt.figure(figsize=(8, 5))
plt.plot(topic_range, coherence_values, marker="o", label="c")
plt.xlabel("Number of Topics")
plt.ylabel("Coherence score")
plt.legend()
plt.show()

print(f"Best number of topics for bigram: {best_number_of_topics}")
100%|██████████| 6/6 [02:04<00:00, 20.76s/it]
No description has been provided for this image
Best number of topics for bigram: 6
In [30]:
import numpy as np
from gensim.models import LdaModel, CoherenceModel
from tqdm import tqdm

coherence_values = []
best_model = None
best_coherence = -np.inf
best_number_of_topics = None

topic_range = range(2, 8, 1)

for num_topics in tqdm(topic_range):
    model = LdaModel(
        corpus=corpus_tri,
        num_topics=num_topics,
        id2word=trigram_dict,
        passes=5,  # More passes improve topic coherence
        random_state=42,
    )  # Train LDA model

    coherencemodel = CoherenceModel(model=model, texts=trigram_texts, dictionary=trigram_dict, coherence="c_v")

    coherence_values.append(coherencemodel.get_coherence())

    if coherence_values[-1] > best_coherence:
        best_coherence = coherence_values[-1]
        best_model = model
        best_number_of_topics = num_topics

# Plot the coherence scores
plt.figure(figsize=(8, 5))
plt.plot(topic_range, coherence_values, marker="o", label="c")
plt.xlabel("Number of Topics")
plt.ylabel("Coherence score")
plt.legend()
plt.show()

print(f"Best number of topics for trigram: {best_number_of_topics}")
100%|██████████| 6/6 [02:02<00:00, 20.44s/it]
No description has been provided for this image
Best number of topics for trigram: 7
In [31]:
import numpy as np
from gensim.models import LdaModel, CoherenceModel
from tqdm import tqdm

coherence_values = []
best_model = None
best_coherence = -np.inf
best_number_of_topics = None

topic_range = range(8, 14, 1)

for num_topics in tqdm(topic_range):
    model = LdaModel(
        corpus=corpus_tri,
        num_topics=num_topics,
        id2word=trigram_dict,
        passes=5,  # More passes improve topic coherence
        random_state=42,
    )  # Train LDA model

    coherencemodel = CoherenceModel(model=model, texts=trigram_texts, dictionary=trigram_dict, coherence="c_v")

    coherence_values.append(coherencemodel.get_coherence())

    if coherence_values[-1] > best_coherence:
        best_coherence = coherence_values[-1]
        best_model = model
        best_number_of_topics = num_topics

# Plot the coherence scores
plt.figure(figsize=(8, 5))
plt.plot(topic_range, coherence_values, marker="o", label="c")
plt.xlabel("Number of Topics")
plt.ylabel("Coherence score")
plt.legend()
plt.show()

print(f"Best number of topics for trigram: {best_number_of_topics}")
100%|██████████| 6/6 [01:59<00:00, 20.00s/it]
No description has been provided for this image
Best number of topics for trigram: 12

количество топиков возьмем 7

In [ ]:
number_topics_un = 4
number_topics_bi = 6
number_topics_tri = 12


ldamodel_un = models.ldamodel.LdaModel(corpus, id2word=dictionary, num_topics=number_topics_un, passes=5)



ldamodel_bi = models.ldamodel.LdaModel(corpus_bi, id2word=bigram_dict, num_topics=number_topics_bi, passes=5)
ldamodel_tri = models.ldamodel.LdaModel(corpus_tri, id2word=trigram_dict, num_topics=number_topics_tri, passes=5)
In [33]:
## получение топиков
topics_gensim_un = ldamodel_un.show_topics(num_topics=number_topics_un, num_words=100, formatted=False)
topics_gensim_bi = ldamodel_bi.show_topics(num_topics=number_topics_bi, num_words=100, formatted=False)
topics_gensim_tri = ldamodel_tri.show_topics(num_topics=number_topics_tri, num_words=100, formatted=False)

topics_un = pd.DataFrame(topics_gensim_un)
topics_un.columns = ["topic num", "topic_word"]

topics_bi = pd.DataFrame(topics_gensim_bi)
topics_bi.columns = ["topic num", "topic_word"]

topics_tri = pd.DataFrame(topics_gensim_tri)
topics_tri.columns = ["topic num", "topic_word"]

Vizualization¶

In [34]:
vis_un = gensimvis.prepare(ldamodel_un, corpus, dictionary)
vis_bi = gensimvis.prepare(ldamodel_bi, corpus_bi, bigram_dict)
vis_tri = gensimvis.prepare(ldamodel_tri, corpus_tri, trigram_dict)

pyLDAvis.enable_notebook()
In [35]:
vis_un
Out[35]:
In [36]:
vis_bi
Out[36]:
In [37]:
vis_tri
Out[37]:
In [ ]:
topics_gensim_base_np = topics_base.values
topics_gensim_bi_np = topics_bi.values
In [43]:
topic_gensim_bi.head()
Out[43]:
topic word_in topic weght_topic
0 0 очень 0.020411
1 0 завтрак 0.014272
2 0 хороший 0.011491
3 0 гостиница 0.011312
4 0 <num> 0.007953
In [42]:
for i in range(4):
    plotWordCloud(topic_number=i, topics=topics_gensim_un, head="Топики uni ")
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
In [43]:
for i in range(6):
    plotWordCloud(topic_number=i, topics=topics_gensim_bi, head="Топики bi ")
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
In [45]:
for i in range(12):
    plotWordCloud(topic_number=i, topics=topics_gensim_tri, head="Топики tri ")
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Назначим каждому документу наиболее подходящий (наиболее вероятный) для него топик, для каждой из моделей(base и bi).¶

In [47]:
df_init["lda_un"] = df_init["ls_normalized_text"].apply(get_topic, lda=ldamodel_un)
df_init["topic_un"] = df_init["lda_un"].str[0]
df_init["probability_un"] = df_init["lda_un"].str[1]


df_init["lda_bi"] = df_init["ls_normalized_text"].apply(get_topic, lda=ldamodel_bi)
df_init["topic_bi"] = df_init["lda_bi"].str[0]
df_init["probability_bi"] = df_init["lda_bi"].str[1]


df_init["lda_tri"] = df_init["ls_normalized_text"].apply(get_topic, lda=ldamodel_tri)
df_init["topic_tri"] = df_init["lda_tri"].str[0]
df_init["probability_tri"] = df_init["lda_tri"].str[1]

Look at the evident samples of the classes¶

In [48]:
for i in range(0, 4):
    print(f"===================={i}=======================")
    filtered_df = df_init[(df_init["probability_un"] > 0.9) & (df_init["topic_un"] == f"{i}")]
    display(filtered_df[["topic_un", "review_text", "probability_un"]].head(5))
====================0=======================
topic_un review_text probability_un
9 0 В отеле hawthorn suites JBR были с 1 по 6.02.17. Отель не соответствует уровню 4*. Сервис не очень хороший, уборка номеров - плохо! Мы были с семьёй - 4 взрослых. При заезде в номер было только 1 полотенце! Не отдельно для лица, рук, банное. А вообще одно! На второй день попросили поставить все на 4 человека, так и не дождались. В номер принесли только дополнительные халаты и так и не убрались. И только на 4 день проживания доставили все необходимое. Когда я попросила Мейл генерального менеджера. 0.977289
16 0 Хочу сказать что я в полном восторге от этого отеля!И если поеду еще раз в дубай то снова туда!Это сказочный отель и стоит этих денег!Мы провели не забываемые дни как в сказке !Завтраки супер ,чистота номеров 5+,Сервис диствительна толька там такой ! Это отель высокова класса!! Не успели приехать так снова хочется обратно! 0.968671
18 0 дважды были в этом отеле и если выберем дубаи, то скорее всего сюда жехотя 2-ой раз понравилось меньше, очень много стало русских и персонала и гостей, а это к сожалению для нас скорее минусотличное отношение к детям, много места и на пляже и у бассейнов, гулять с коляской и играть, первый отель инфраструктуры которого достаточно, и не хочется выезжать 0.973772
35 0 Могу отнести себя к постоянным клиентам этого отеля. Первый раз приехали в него с женой семь лет назад. С тех пор постоянно остонавливаюсь здесь. Всегда клубный уровень. В прошлом году построили и открыли новое крыло отеля и реконструировали пляж и бассейны. Раньше было мало соотечественников, сейчас начали работать с российскими турфирмами и это преимущество спокойного отдыха к сожалению пропало. 0.941767
70 0 Первый раз в Дубай - и первый отель - Zabeel Saray. Если честно, наверное совершили небольшую ошибку установив такую планку), поскольку следующие отели уже в чем-то не вписывались в наши требования.Собственно отель произвел потрясающее впечатление...... Номера, рестораны, пляж, бассейны. Новогоднее представление и новогодний ужин были выше всяких похвал. На сегодняшний момент, это однозначно тот отель в который хочется ехать в Дубай независимо от времени года.Единственный минус - конечно это его цена......... Но за удовольствие необходимо платить. 0.928347
====================1=======================
topic_un review_text probability_un
350 1 Отдыхали вдвоем с супругой в этом отеле 5 дней в середине марта.Отель отличный. Отель многоэтажный (больше 10 точно, в лифте не запомнил сколько кнопок) в новом районе Марина, стеклянный, в современном стиле. Очень уютный и современный. Есть бассейн, столовая, магазинчики, какойто салон и по моему спорт зал.В номере есть все необходимое. Мы брали двух местный. Холодильник, бесшумный кондиционер, двуспальная кровать, очень удобный матрац, стол, зеркало, столик диван, шкаф и для чемодана подставка, кухня с полноценными шкафами и посудой, стиральная машина с функцией сушки, телевизор с русскоязычными каналами, чайник и сейф - большой. Ну и конечное же сан узел со всем необходимым и ванной, также был фен. Розетки не евро но воткунуться было куда - в фен и у тумбочки для светильника был разьем под нушу вилку. Ежедневно давали 2 бутылки воды, чай, кофе и сахар.В номере ежедневно убирались, меняли несколько раз белье, каждый день свежие полотенца. Также выдавали полотенца для пляжа.До залива идти минут 10 - 15. Завтрак не брали. Ужинали в отеле - готовят отменно! Окрошка особенно порадовала!Еще внизу можно приобрести экскурсию. Рядом много кафешек, торговый цент минут 10 пешком и метро тоже минут 10. Будем рекомендовать этот отель всем знакомым, а если еще поедем в Дубай, то только в этот отель. Персонал приветливый, всегда улыбаются и здороваются, открывают двери.Если отзыв полезен оцените. 0.906503
381 1 Гостиница расположена достаточно удачно с точки зрения ознакомления с городом: рядом станция метро (ближайшая -- Burjuman, выходить на exit 2) откуда можно относительно быстро добраться почти хоть куда. До Дубай-молла и Бурж-Халифа ехать 10 минут за 2,3 дирхама, до Марины 25-30 минут и 4,1 дирхама. Через дорогу от гостиницы у торгового центра Burjuman находится останока Big Bus Tour.Сама гостиница чистая и опрятная, номера просторные. Есть бесплатный wi-fi. Завтраки разнообразные и вкусные.Ресторан Kris Kin на 19 этаже просто отличный и вид из него отменный, Le Metro на первом этаже работает круглосуточно, что очень удобно.Очень выручал бар на первом этаже, где можно было выпить пива и перекусить. 0.954704
428 1 Чудесный отель( останавливаемся 3 раз). Находиться далеко от Jumeirah , но с детьми близко ехать до парка раздвоений, Lego Land парка и др, различений. Удобно ехать до Абу даби. Тихий отдых на природе (.територия большая и зелёная ) . Персонал внимательный. 0.946814
458 1 Находится прямо около метро. Приятно удивиди велком дринком каждый раз. Персонал очень отзывчивый и старается во всем помогать. Линия метро удобная тем, что ветка и можно поехать по двум линиям. Номера нормальные, чистые. Каждый день дают бутылку воды 0.963529
483 1 Если вы едете в Дубаи, чтобы много посмотреть и в отеле только ночевать, то отель сойдет. Из плюсов есть бассейн на крыше, сносный завтрак. Номера небольшие, все соответствует трехзвездочному отелю. До метро идти минут 10-15, есть автобус на бесплатный пляж. 0.944900
====================2=======================
topic_un review_text probability_un
2 2 Провели с супругой там уик енд. Брали самый люкс с видом на фонтаны. Все было на уровне. Отличный панорамный вид на фонтаны. Номера шикарные просторные стильные. Во всем чувствуется качество и люкс. К номеру бесплатно предоставили бентли с водителем. Завтраки отличные , безупречное спа, прекрасный фитнес, во общем недостатков нет, кроме того что отель городской и моря рядом нет. Ну и маленький бассейн. 0.978078
10 2 Номера очень просторные и красивый вид из окна.Большой плюс - это наличие Интернета в комнате.Хорошо провели время в этом отеле! 0.933540
32 2 Удобная чистая готиница,прекрасно для тех кто любит спокойный отдых.Хорошо отдыхать с семьейПрекрасный пляж.Много басейнов чистота ,не шумно.Единственное было бы лучше если прием был бы более приветливым и служба консержа более внимательным 0.950930
33 2 Комфортное место для отдыха с семьей. Хороший пляж. Немного шумно от стройки рядом, но это временно. Рядом расположен отличный ночной клуб. Хорошие рестораны, очень комфортный СПА. Но, нет русскоговорящего персонала, что является большой проблемой для наших соотечественников . 0.909419
54 2 Все было супер. Если полетим отдыхать в Эмираты, то остановимся только в этом отеле.Персонал очень доброжелательный. Обязательно будем рекомендовать только этот отель.Расположен очень хорошо к пляжу 0.921892
====================3=======================
topic_un review_text probability_un
24 3 В отеле НЕТ ГОРЯЧЕЙ ВОДЫ. Только холодная и очень холодная. Когда просишь вызвать такси-тебе подсовывают каких-то нелегальных извозчиков с завышенными в 3 раза ценами. Неплохой ресторан. Хороший вид из окна (если повезет). Вокруг отеля стройка со всех сторон. 0.945150
558 3 Отель никак не соответствует 4-м заявленным звездам, это твердая двойка. Он терпимый, но нельзя писать, что это 4*Плохое расположение. Сервис ок. Еда более менее, но совершенно опять же не 4*Чистота номеров - не супер, но убирали каждый день. 0.964991
656 3 Есть номера для курящих (в них запах дыма не выветривается) и номера для некурящих.На второй день договорились, и нам бесплатно поменяли номер.Завтраки понравились. Обслуживание понравилось.Полностью соответствует своему классу и стоимости. 0.956712
683 3 Все в целом хорошо, персонал приветливый, но есть и но:1. интернет в номере почти не ловит, а если ловит не работает2. вода в душе чуть теплая3. плохо уходит в ванной, попросили отремонтировать...посмотрим 0.952981
857 3 Убираются плохо.Только меняли постельное белье и полотенца. Полотенца очень старые. Полы ни разу не пропылесосили и не помыли за 2 недели. Пыль не вытирали. Кухня очень хорошо оборудована бытовой техникой. Есть тостер, микроволновая печь, электрическая плита, кофеварка, электрический чайник и холодильник. также посуда и кастрюли. Можно готовить все необходимое. Очень плохое освещение в комнатах. И очень слышно шум от соседей. Особенно звук двигающихся стульев. Надо что-то им придумать на этот счет. Если хотите жить на Монмартре, то можно поселиться здесь. Но если Монмартр не принципиален, то можно найти что-то получше. 0.983652
In [49]:
for i in range(0, 6):
    print(f"===================={i}=======================")
    filtered_df = df_init[(df_init["probability_bi"] > 0.9) & (df_init["topic_bi"] == f"{i}")]
    display(filtered_df[["topic_bi", "review_text", "probability_bi"]].head(5))
====================0=======================
topic_bi review_text probability_bi
16 0 Хочу сказать что я в полном восторге от этого отеля!И если поеду еще раз в дубай то снова туда!Это сказочный отель и стоит этих денег!Мы провели не забываемые дни как в сказке !Завтраки супер ,чистота номеров 5+,Сервис диствительна толька там такой ! Это отель высокова класса!! Не успели приехать так снова хочется обратно! 0.967661
141 0 Отдыхала с 13 сентября, неделю. Все очень понравилось! Всем рекомендую! Не верьте плохим отзывам! Встретили хорошо, дали номер на ступень выше! Кормили в ресторане оч вкусно и изыскано! Пляж и море великолепны! Нет никаких запахов! Отдельно спасибо персоналу и девочкам на ресепшене, все приветливые и добрые! Всем удачи! 0.974420
410 0 В июле отдых в отеле Le Royal Meridien Beach Resort & Spa удался. Летели из Донецка Air Arabia - комфортно 4 часа. В Шардже встретили цветами.Отвезли в отель к 11 вечера как раз к ужину. От обслуживания только приятные впечатления. У отеля есть душа. Она в улыбках и предупредительности каждого работника, которого я встречала. Не смотря на низкий сезон отель полон туристов. Территория отеля великолепная. Океан, конечно же, 37 градусов , но мне понравилось.Три бассейна на территории отеля , носят охлаждённые полотенечки и воду. Завтраки и обеды безукоризненны , великое множество морепродуктов,элитных сыров, фреши, в общем европейская кухня, здесь и воду подают в стекле. Холл отеля наполнен особой атмосферой. Живые цветы , мерцание свечей и прекрасное пение (в ресторане живая музыка) делают романтичным каждый вечер. Я осталась очень довольна. Думаю стоит вернутся сюда и не раз. 0.932169
432 0 Приезжали во второй раз, все впечатления только позитивные. Это тот отель, в который хочется вернуться еще раз. Отдыхали в августе, были удивлены водорослями и обмелевшим морем, может это временные неудобства... 0.953022
600 0 Отдых провели просто чудесно Отдыхали 28 дней Приедим ещо если приобретут коляски на воду чтобы люди с ограниченными возможностями могли наслаждаться морем Будем рады если об этом будут помнить Большое всем спасибо 0.955753
====================1=======================
topic_bi review_text probability_bi
32 1 Удобная чистая готиница,прекрасно для тех кто любит спокойный отдых.Хорошо отдыхать с семьейПрекрасный пляж.Много басейнов чистота ,не шумно.Единственное было бы лучше если прием был бы более приветливым и служба консержа более внимательным 0.947385
39 1 Трижды были здесь. Каждый раз качество пребывания было на высоком уровне! Лаунж очень сильный и удобный. Пляж уютный, есть возможность загорать на травке. Находится на волке, так что можно развлечь себя вечером прогулкой по нему и заходом в одно из кафе. Также имеются хорошие магазины по близости. Всем советую! 0.968668
54 1 Все было супер. Если полетим отдыхать в Эмираты, то остановимся только в этом отеле.Персонал очень доброжелательный. Обязательно будем рекомендовать только этот отель.Расположен очень хорошо к пляжу 0.930089
84 1 Останавливаемся в отеле не в первыйи, надеюсь, не в последний раз. Удачное расположение, прекрасное обслуживание, вежливый и доброжелательный персонал, всегда готовый помочь в решении вопросов. Чистота в номере. 0.947030
100 1 Расположен очень красиво, пляж и номера красивые. Обслуживание отличное. Самое главное есть с кем на русском поговорить... И район очень удачный. Очень доволен этим отелем. Рядом каждые выходные бесплатный авто мото шоу ;) 0.961838
====================2=======================
topic_bi review_text probability_bi
683 2 Все в целом хорошо, персонал приветливый, но есть и но:1. интернет в номере почти не ловит, а если ловит не работает2. вода в душе чуть теплая3. плохо уходит в ванной, попросили отремонтировать...посмотрим 0.957948
770 2 Плюс - расположение, недалеко от Opera, Galeries Lafayette, в 5 минутах ходьбы от метро и многочисленных баров.НО - состояние отеля удручающее! Низкие потолки, дешевое мыло в ванной комнате, узкие коридоры, ступени просто разваливаются. А персонал просто оставляет желать лучшего: неприветлив, холоден, а порой и просто раздражителен. Завтрак скуден, столовая маленькая, все столы почти всегда заняты и нет чистой посуды.Не реокмендую!!!! 0.978412
836 2 Плюс: Местоположение - 5 минут пешком до Нотр-Дамма.Минусы: Очень тесно во всем отеле. Маленький ресепшн. Маленькие коридоры. Маленький лифт. Маленькие комнаты. Маленькое все. Номера подходят разве что для режима "только переночевать". Но и с этим могут быть проблемы - мизерные подушки, не совсем подходящие для сна. Парковка есть, но не собственная. Расположена в соседнем квартале. Чемоданы придется нести самостоятельно. 0.973697
1897 2 Еще один отель, который удалось посетить в Париже. Чем понравился:1) Вежливый и доброжелательный персонал.2) Чистые и опрятные номера.3) Одно из самых важных на мой взгляд - бесплатный Wi-Fi.4) Хорошие широкие кровати. 0.947174
2139 2 Удобно расположен для пеших прогулок и не далеко от станции метро/электропоездов (RER). Уютный и чистый. Доброжелательный персонал. Маленькие минусы: на завтрак- горячие только чай-кофе-молоко...))) В номерах (мы снимали два номера) "очень хорошо" помыли чайники- первое время в них присутствовал запах уксуса.... Но мы прожили неделю и в целом остались очччень довольны!!! 0.915946
====================3=======================
topic_bi review_text probability_bi
204 3 Отель находится рядом с аэропортом 15 минут на такси. Русских селят на этаж между лобби и первым, окна на козырек, запах из вытяжки кухни, видели маленького тараканчика. В номере холодно. Из плюсов: близко метро, завтраки. 0.963335
277 3 Сам по себе отель хороший, расположен в верхней зоне аэропорта. Он как бы возвышается над круглосуточной суетой торговой пешеходной зоны терминала аэропорта. С точки зрения комфорта все замечательно- чистое нежное белье просторные мягкие кровати, хороший санузел. Но - больше 200 долларов менее чем за сутки (а более суток там кажется вообще никто не останавливается) это конечно существенный барьер на пути стыкующихся в Дубае. Кроме того персонал отеля без спроса списывает со счета карты оплату в валюте кредитной карты - т.е. с двойной конвертацией - сначала из рублей (долларов, евро) в AED а потом обратно в рубли. Будьте внимательны - требуйте списания в валюте отеля иначе + 7% к стоимости проживания вам гарантировано прибавится! Что приятно поразило - доставка еды в номер оказалась по стоимости ниже чем стоит поесть в ресторане терминала аэропорта. 0.988764
328 3 Останавливались в этом отеле на Новый Год 2014.Не хотел отель, расположенный в Дейре из-за специфичной публики и обстановки, но и Дубай Марина дороговато, поэтому поселились где-то посередине.Вокруг строящийся район, однако, довольно мирный и тихий.До метро идти 10 минут, до Mall of the Emirates - около 15 минут. Этот молл, кстати, понравился больше всего в Дубае, не такой необъятный и суетливый как Dubai Mall.На метро можно быстро доехать и до Даунтауна и до Марины. Но до Марины советую всё же взять такси: будет стоить около 20 дирхамов.Номера стандартные, практически такие же, как в России, возможно только санузел поменьше. Завтраки более-менее неплохие, но очень однообразные, за неделю сильно надоели. 0.984714
459 3 Отель входит в часть выставочных зданий World Trade Centre, где постоянно проходят какие то выставки и распродажи. Для тех кто приехал на выставку один из лучших вариантов размещения. До выставочного зала от номера 5 минут пешком.Рядом (8 минут пешком) станция метро.Есть ресторан при отеле и рядом еще несколько, но показатель цены/качество не хороший, сказывается близость выставочного комплекса.До пляжа 15 минут на такси. Трансфера на пляж нет.Сильно удивило, что халаты есть, а тапок нет, но так и написано, так что это не минус а особенность.Номер небольшой, 25кв/м. что опять же говорит о бизнес направленности отеля.Хороший персонал.В номере убирались ежедневно, с замной полотенец и косметики. 0.911796
557 3 Все хорошо...не отлично конечно но хорошо...грех жаловаться есть все. Интернет вай фай бесплатный. Парковка бесплатная подземная. Завтрак шведский стол все говорят что в Турции лучше но нам и так норм было. Так что все хорошо... 0.939872
====================4=======================
topic_bi review_text probability_bi
38 4 Пляж у отеля свой, огороженный, но напротив в 200 метрах идет грандиозное строительство (идет отсыпка), грузовики, экскаваторы, огромные баржи с камнями - вода не совсем чистая.Территория красивая, но маленькая. Еще один минус, что комнаты без балкона.. 0.961761
446 4 Отелем остался очень доволен. Есть все что можно захотеть. Большая территория и везде комфортная обстановка. Отличный завтрак. Утро после завтрака сидя в горячей жакузи трудно поднять себя и лень выходить из отеля) 0.950583
813 4 Шикарное место, шикарная история отеля, номера, как и всегда в Париже не самые просторные, но все необходимое есть. Самое главное, что иногда везет и тебе дают номер, где с балкона можно наблюдать за Опера. Завтраки очень достойные. 0.950496
996 4 Отличный отель с богатой историей. Список знаменитостей поражает. Очень хорошо - Лувр виден с балкона. Номера чистые с интересной мебелью. Рядом куча ресторанов. Хорошее расположение, просторный номер, который убирали каждый день, нормальные завтраки, Wi-Fi везде работает. Да унитаз от villeroy&boch. 0.968769
1158 4 I stayed at the Citadines Trocadero for the third time. This is a very convenient location close to the center of Paris, but quiet and safe. In walking distance from the Trocadero, Champ de Mars, the Eiffel Tower. Near three metro stations, cafes, restaurants, supermarkets. Very comfortably. 16 arrondisment Paris, very calm. There are no crowds of tourists. Not too many clochard, migrants and beggars. Studio this time went on the 6th floor, small but comfortable. Two large balconies, you can enjoy breakfast outside. Unfortunately the weather did not indulge, almost all the days it rained.Я останавливаюсь в Citadines Trocadero уже в третий раз. Это очень удобное место рядом с центром Парижа, но тихое и безопасное. В шаговой доступности от Трокадеро, Марсова поля Эйфелевой башни. Рядом три станции метро, кафе, рестораны, супермаркеты. Очень удобно. 16 аррондисмент Парижа очень спокоен. Здесь нет толп туристов. Не слишком много клошаров, мигрантов и попрошаек. Студия на этот раз досталась на 6 этаже, небольшая но удобная. Два больших балкона, можно завтракать на улице. К сожалению погода не баловала, почти все дни шли дожди. 0.931413
====================5=======================
topic_bi review_text probability_bi
7 5 Хороший отель. Питание отличное. Хотя отель не старый, но требует ремота в ванных компатах. Было сыро, вещи не высыхали. 0.923633
672 5 Шикарный отель. Сервис на высшем уровне. Огромная и зеленая территория. По которой можно перемещаться или на багги или на лодочках. Возможность бесплатного посещения аквапарка для постояльцев отеля. Дружественный персонал. Заселили в номер сразу по приезду, а это было около 7-ми утра. 0.963317
1029 5 Все было хорошо, хотя цены, если их брать без скидки от а клуба, несколько завышены. 0.906613
1797 5 Не соответствует цене и качеству! Номера тянут еле еле на 3 звезды! Нет бедэ в туалетах! Телевизоры до потопные, с пульта еле переключаются! За 300 евро в день могло бы и лучше быть! Все серое и мрачное , ремонт явно нужен! 0.963548
2581 5 Украли сумку с обувью. После этого появилась табличка в холле, что администрация не несет ответственности за украденные вещи....В остальном претензий у меня нет. Удобное месторасположение, новый ремонт в номерах. 0.955794
In [52]:
for i in range(0, 12):
    print(f"===================={i}=======================")
    filtered_df = df_init[(df_init["probability_tri"] > 0.7) & (df_init["topic_tri"] == f"{i}")]
    display(filtered_df[["topic_tri", "review_text", "probability_tri"]].head(5))
====================0=======================
topic_tri review_text probability_tri
6682 0 宮殿橋のあたりまで楽々お散歩できるので、跳ね橋があがるのを(AM1:35)見学してから徒歩で帰っても大丈夫でした。ただし、フロントが3階にありエレベーターが無いので、スーツケースを運ぶのが大変です。プチホテルなのでもちろん団体客の利用も無く、ホテル内はとても静かでした。バスタブ付き希望だったためコンフォートルームを利用したのですが、3人入れるくらいの大きいバスタブだったため、お湯をためるのが大変で結局シャワーのみを利用した日もありました。カップルや新婚さんが一緒に入るぶんにはステキだと思うのですが…。 0.770832
====================1=======================
topic_tri review_text probability_tri
120 1 Попали в этот отель случайно. Наш самолет задержался по погодным условиям. Нас встретили, заселили с 4-х разовым питанием, а утром проводили в Джакарту. Огромное спасибо отелю Millennium Plaza Hotel Dubai и авиакомпании Emirates! 0.721260
431 1 Нас отель привлёк тем, что находится вдали от города. Получили то, что и ожидали, даже немного больше. Великолепный парк на территории отеля, водопады, птицы. Очень чистый и ухоженный пляж, заход в море был очень неплохой и купание не доставляло проблем. Вот только вид на бетонные конструкции немного портит общую картину. 0.703712
3340 1 Открыли этот отель для себя 3 года назад. После всех 5* Питера, этот отель всегда оставляет лучшие впечатления. Душевный прием персонала, оригинальные номера (больше всего оценили номера на втором этаже, выходящие на канал: Париж, Санкт-Петербург, Рим). Жаль только, что на завтрак перестали готовить сырники, раньше они там были восхитительны:))) 0.963326
6423 1 Приехал в пансионат после большого перерыва, ничего не изменилось кроме цен и чистоты в номере и качества белья. Цены изменились в худшую сторону , особенно раздражает что за каждый отдельный чих приходиться платить, а все остальное в лучшую сторону. Еда отличалась разнообразием но при этом была пресная и безвкусная. 0.830752
====================2=======================
topic_tri review_text probability_tri
281 2 Отличный отель, комфортный, тихий, чистый, с хорошим сервисом. Совсем не ощущаешь себя в аэропорту. Вркруг - приличные рестораны, duty-free. Приветливый персонал, готовый во всём помочь, вплоть до проводов и помощи с багажом до соседнего терминала. 0.747938
877 2 Средненький отель, но в плане перемещений удобен, рядом метро, есть кафешки и супермаркеты, стоит не полениться и сходить до канала Сан-Мартен, там своя атмосфера и по-своему красиво. Типичный завтрак, круассан, сок, кофе, багет - всё свежее. Доброжелательный персонал. В номерах нет посуды (кружек, ложек). 0.963318
====================3=======================
topic_tri review_text probability_tri
363 3 От отеля есть трансфер ко второму клубному отелю с лежаками у моря и хорошим бассейном. Питание очень хорошее. На завтраках куча народа с детьми, а вот ужины просто потрясающие разнообразное меню которое Ежедневно меняется 0.769915
====================4=======================
topic_tri review_text probability_tri
====================5=======================
topic_tri review_text probability_tri
124 5 В отеле очень стараются сотрудники - очень трудолюбивые и усердные + еда на завтраке приличная ! Рядом выставочный центр, остальное катастрофа - воняет хлоркой, видно делают дезинфекцию по полной программе, сауна и паровая баня на уровне 2*, лифты очень долгие с идиотской системой, кондиционер старый, окна не моют 0.704235
125 5 Отель мне кажется не тянет на 4,точно 3 по мировым стандартам.Рядом был 4 звезд-й отель,по сровнению с этим отелем куда больше круче.25 этажное здание и только 2 лифта,а на завтрак каждый день одно и тоже,мало выбора.На некоторых местах кафель отваливался.В общем отель не для ценителей комфотрного отдыха.А отель сам по себе очень хорошо расположен,рядом и метро.Окно нашего номера выходило на здание напротив,и ничего кроме стекла нам не было видно. 0.745164
174 5 Мы там остановились на три ночи с 7 по 10 января, с самого первого дня в ужасе были, номера ужасные - мебель побитая, разбитая, в комнате и в ванной грязно было, сервис ужасный, в ресепшене тоже отношение ужасное.... народу много на удивление и все в шоке от такого ужаса, очень шумно в отеле и в номерах, ночью спать невозможно было, шум сверху, с боку... как будто заселились в общежитии. Утром чтоб позавтракать надо было ждать и искать место, так как народу много было, в общем не отдых а катарга!!! 0.932138
306 5 Абсолютно простой, ничем не запоминающийся отель. Нет каких либо провалов, но и нет ничего запоминающегося. Пришли, переночевали, ушли... Завтраки обильные, но однообразные. Если номер возле лифтов, то слышно как они довольно громко сигналят с 1 по 14 этаж - фойе открытое. Если у вас бессонница, то может возникнуть проблема. 0.878165
743 5 В целом неплохо за исключением неосведомленности туроператора о сервисах отеля. Не возможно спать в четвером на одной кровати. Наличие одного стула на четверых считаю недопустимым. На полу по всему номеру чужие волосы. 0.828071
====================6=======================
topic_tri review_text probability_tri
123 6 Новый бизнес отель идеально расположен для тех кто приехал посетить выставки в районе WTC 0.792522
457 6 Просторные, чистые апартаменты. До всех достопримечательностей только на такси, с которым в этом районе небольшие проблемы. В общем, зная цены в Дубае на отели, это вполне достойный вариант цена/качество. 0.951746
571 6 Отель находится в районе Марина. Расположен прямо на набережной канала, рядом много ресторанов, кафе и магазинов, невозможно остаться без покупки. До пляжа джумейра совсем недалеко. Хорошие номера и неплохие завтраки. 0.750969
696 6 Отличный отель. Новый, хороший дизайн. Отличный персонал. Недалеко от пляжа. Далековато от метро, но несложно пользоваться автобусами для поездок до метро, тем более платить за это отдельно не приходится. Завтраки скудноваты, но вполне сносно. Из близлежащих кафе очень рекомендую Saladisios. Он находится по дороге на пляж между улицами Al Wasl и Jumeirah. В отеле предоставляется один час Wi-Fi бесплатно. Но его можно использовать по частям, поэтому этого было вполне достаточно. 0.730585
731 6 Местопасполойение било очень хороший,недалеко от пляжа.Отель наьодится близко от станции метро!Уборка, сервис на пятерку. Очень удобное расположение для прогулок .На крыше есть уютный басейин, маленький, но чистый.Недостатки: платный wifi 0.822961
====================7=======================
topic_tri review_text probability_tri
116 7 Очень даже хороший вариант, если цель вашего визита- прогулки по городу и шоппинг. Из плюсов- метро близко, сами возят на городские пляжи, близко несколько ТЦ, приличное питание, достаточно чисто. Минусы- практически их нет (если вы трезво оцениваете 3 звезды). Может только дурацкий вид из окна... 0.747563
215 7 Я счетаю, что этот отель заслуживает еще +1*!!!Когда я жила в этом отеле, производили полный капитальный ремонт! Новая мебель, абсолютно все заменяли на новое!!! Далеко не во всех 4* отелях вы можете увидишь в своем номере фен, сейф, и телевизор плазму... В этом отеле все выше перечисленное уже входит в стоимость за номер! Цена по Дубайским меркам реально доступная! А так же вы можете пользоваться бассейном на крыше, имеется ночной клуб при отеле, и от центра Дубай расположен не так далеко... 0.740672
725 7 Всё культурно. На ресепшене относились к нашим пожланием с пониманием. Недорогая цена. Расположение нам подошло (море не так далеко и метро рядом). Удобный бассейн на крыше - можно комфортно располагаться на мягких креслах, от солнца защищают ОГРОМНЫЕ зонты 0.793458
802 7 Замечательный в соотношении качество-цена отель. Несмотря на крохотные номера, в нем есть что-то абсолютно французское - из витого железа лифт, винтовая лестница, в номерах репродукции Монэ. Окна выходили на проезжую часть, но прекрасная шумоизоляция и качественные теневые шторы гарантируют Вам спокойный сон в любое время суток. Рядом с отелем великолепная французская булочная всегда со свежей выпечкой, супермаркеты и винный бутик с широким выбором французских вин и коньяков изо всех провинций Франции. В двух минутах станция метро и католический храм, множество кафешек и ресторанов. Автобусная остановка напротив отеля, от которой в центр Парижа Вас доставят два автобуса - № 72, который идет через сам город к галерее La Faette (центр продаж и тоже достопримечательность Парижа из-за своего фантастического убранства). Здесь же множество достопримечательностей - опера, национальный музей и ит.д.). Автобус № 22, который выезжает через несколько остановок на парижскую набережную, где Вы можете любоваться и Эйфелевой башней и площадью Конкорд и Трокадеро и т.д. Завтрак всегда одинаков - Вам подают круасан, буквально половину французского батона, мед, джем, масло. Все остальное Вы выбирате сами - сыр, ветчина, яйца, шоколадная паста, чай, какао, кофе, молоко. Удачного путешествия в сказочный Париж! 0.715492
830 7 Что может быть лучше, чем остановиться в 10 минутах неспешной ходьбы от Лувра с одной стороны, и от Нотр-Дам - с другой? Отель на маленькой улочке, очень небольшой, несколько старомодный. И хотя наши окна выходили во двор, тем не менее общее впечатление было превосходное. Аромат времени подчеркивали крутые лестницы, почерневшие дубовые балки перекрытий на потолке комнаты... Нам понравилось. 0.805318
====================8=======================
topic_tri review_text probability_tri
7 8 Хороший отель. Питание отличное. Хотя отель не старый, но требует ремота в ванных компатах. Было сыро, вещи не высыхали. 0.916576
9 8 В отеле hawthorn suites JBR были с 1 по 6.02.17. Отель не соответствует уровню 4*. Сервис не очень хороший, уборка номеров - плохо! Мы были с семьёй - 4 взрослых. При заезде в номер было только 1 полотенце! Не отдельно для лица, рук, банное. А вообще одно! На второй день попросили поставить все на 4 человека, так и не дождались. В номер принесли только дополнительные халаты и так и не убрались. И только на 4 день проживания доставили все необходимое. Когда я попросила Мейл генерального менеджера. 0.853009
16 8 Хочу сказать что я в полном восторге от этого отеля!И если поеду еще раз в дубай то снова туда!Это сказочный отель и стоит этих денег!Мы провели не забываемые дни как в сказке !Завтраки супер ,чистота номеров 5+,Сервис диствительна толька там такой ! Это отель высокова класса!! Не успели приехать так снова хочется обратно! 0.777891
18 8 дважды были в этом отеле и если выберем дубаи, то скорее всего сюда жехотя 2-ой раз понравилось меньше, очень много стало русских и персонала и гостей, а это к сожалению для нас скорее минусотличное отношение к детям, много места и на пляже и у бассейнов, гулять с коляской и играть, первый отель инфраструктуры которого достаточно, и не хочется выезжать 0.971336
29 8 Были с 22 февраля по 1 марта 2014.Отдыхал с женой о дочерью 12 лет.Думаю, что отель подходит для активных людей, которые любят отдыхать самостоятельно. Так как, транспортное расположение, лучше не придумаешь. Но, об этом позже.1) Номер был 435, то есть на 4-ом этаже. Так как, в этом отеле популярный, среди местного населения, бар и дискотека, то, этот этаж - самое то. Бум-бум, конечно доноситься, но мы спали нормально, так как усталость, после целого дня гуляния, даёт о себе знать. Если бы жили на 3-ем этаже, то, наверное, было бы гораздо шумнее.Номер - двуспальная кровать, шкафы, телевизор, холодильник. Всё староватое, но чисто, аккуратно. Никакой живности, как говорят в других отзывах, не наблюдали.Сейф бесплатный на ресепции. Фен, утюг и кипяток приносят в номер. Язык общения - английский. Хотя, есть русскоговорящий Азиз, но он работает не каждый день. Все приветливые, проблем не было - они здороваются и я здороваюсь, они улыбаются и я улыбаюсь )) Всё было нормально. Главное - не париться. Хотя, были некоторые наши соотечественники, которые, с сильным возмущением, всё время что-то требовали, причём громко и на русском языке.2) Питание - завтраки. Каждый день одно и тоже. Яичница, сосиски, вода, сок, чай, тосты, фрукты. Но, нам хватало и за неделю, почти не надоело ). Голодными не были. Сосиски попросите у персонала, так как, на общем столе их нет. Местные блюда на завтраке пробуйте с особой осторожностью - очень острые.3) Любителям алкоголя. На 1-ом этаже, возле ресепции, есть бар. Продают и пиво и водку и коктейли. Пиво (Будвайзер), около 250 руб. за кружку. Там же, в баре, находятся жрицы любви, которые будут к вам обращаться. Но, если, вы скажете (на английском, естественно )), что вы хотите побыть один и просто выпить пару пива, теряют к вам интерес. Поэтому, можно просто посидеть, попить немного пивка и посмотреть телик, там спортивный канал. А алкоголь, лучше приобретите в Дьютике по прилёту в Дубай.4) Транспорт. Рядом автобусная станция (Аль Губейба) и станция метро №24, 5 минут пешком от отеля. Если планируете использовать общественный транспорт, то купите в метро серебряную карточку - стоит примерно 200 руб. Она и для поездок на метро и для автобуса.Автобус №8. На нём, вы можете доехать за 2,3 AED (примерно 20 руб.) до пляжа Джумейра Бич за 15 минут. Пляж - вход бесплатный.Также, на этом же автобусе, примерно за 30 минут, можно доехать до Джумейра Парк Бич. Пляж - вход 5 AED (примерно 50 руб.).И также, на этом автобусе, примерно за 45 минут и примерно за 45 руб. с человека (на такси, примерно 500 руб.), можно доехать до аквапарка Вайлд-Вади.5) Музей Дубая. Рекомендую. От отеля 10 минут пешком. Стоит 1 AED.6) Рядом много кафешек. Можно и шаверму поесть за 5 AED (примерно 50 руб.). Если выйти с заднего входа отеля, то сразу через дорогу, будет кафешка Голден Фок, где есть меню на русском языке. Пиво, там, только безалкогольное )7) На метро с одной пересадкой, примерно за 30 руб. и за 40 минут, доберётесь до Бурж-Халиф, если без пробок на такси, примерно 20 минут и 300 руб. Такси берите, только с разноцветными крышами (синие, зелёные, красные, жёлтые), они возят по счётчику. Другие, вас повезут, в тот же Бурж-Халиф, минимум за 500 руб.ИТОГ. Для нашей семьи было всё комфортно. С утра, после завтрака, на автобусе №8 на пляж, там 3 часа, назад на автобусе. В отель, переодеваться и сполоснуться. После 14.00, в Бурж-Халиф или Дубай-Марина гулять, на метро. Часов в 22.00 на такси в отель, так как ноги отваливались. 0.715854
====================9=======================
topic_tri review_text probability_tri
1107 9 В полне приличный бизнес-отель, приятный дизайн в светлых тонах. Окна выходят, в основново внутренний двор-колодец. Из минусов - стандартно тонкие стены и скрипучие полы, если кто то прошелся по комнате - слышно во всех ближайших номерах. 0.761679
1414 9 Неплохой отель в 2 минутах от острова Сите. Расположение хорошее, но на мой взгляд, слишком "туристическое" - вокруг одни туристические лавки, арабская кухня и оооочень много людей. К счастью, сам отель находится на малюсенькой спокойной улочке, но стоит сделать 2 шага - и ты попадаешь в поток людей, еды и магазинов. Атмосфера Парижа здесь не ощущается.Что касается номера - у нас быд номер на двоих с огромным портретом Франциска Первого над изголовьем кровати, что периодически ночами внушало страх увидеть приведение:) В целом, я бы сказала, что несмотря на артистический тон номера и попытку совместить историю и современность в интерьере, у отеля не получилось создать в нем главное- уют:) 0.760764
3726 9 “Понравилось все! Приветливый, тактичный, высокопрофессиональный персонал. Комфортные номера, отличное месторасположение отеля. Да, и еще нам очень повезло с ценами, в том смысле, что поселили нас в более престижной категории... повезло. Сами будем останавливаться только в "Традиции" и другим советуем. Еще плюс, в двух шагах очень приличное кафе "La menu". ” 0.711274
3736 9 Немного маловат, но в целом отель чудесный. Все в порядке, завтраки радуют. Номера убирают хорошо. Бесплатные чай, вода, миишоколадочки. Кроме того, и кофе тоже бесплатное в пакетиках. Вечером очень выручает. В номере немного скрипела кровать и дверь туалета. Была немного грязновата подушка, и ее не меняли долго. 0.851135
4942 9 Отличный интерьер в холле, на втором этаже (в столовой) камин и пианино, все очень красиво и атмосферно. Очень понравились разрисованные двери! :)Чисто, тихо, 4 минуты пешком от метро. Можно припарковаться во дворе. Каша на завтрак - это очень классно! :) 0.708934
====================10=======================
topic_tri review_text probability_tri
2 10 Провели с супругой там уик енд. Брали самый люкс с видом на фонтаны. Все было на уровне. Отличный панорамный вид на фонтаны. Номера шикарные просторные стильные. Во всем чувствуется качество и люкс. К номеру бесплатно предоставили бентли с водителем. Завтраки отличные , безупречное спа, прекрасный фитнес, во общем недостатков нет, кроме того что отель городской и моря рядом нет. Ну и маленький бассейн. 0.863462
17 10 Потрясающий, восхитительный, роскошный, незабываемый отель! Все на высоте: персонал, сервис, еда!!! Большое количество ресторанов с различными кухнями мира!Прекрасный пляж!!! Большая территория!!!Всем рекомендую! 0.810104
32 10 Удобная чистая готиница,прекрасно для тех кто любит спокойный отдых.Хорошо отдыхать с семьейПрекрасный пляж.Много басейнов чистота ,не шумно.Единственное было бы лучше если прием был бы более приветливым и служба консержа более внимательным 0.835843
54 10 Все было супер. Если полетим отдыхать в Эмираты, то остановимся только в этом отеле.Персонал очень доброжелательный. Обязательно будем рекомендовать только этот отель.Расположен очень хорошо к пляжу 0.923604
64 10 отдыхали семьей в октябре 2013. отель очень понравился.отличный,просторный номер с кухней,где есть все необходимое.Убирали номер каждый день,меняли белье,полотенца. Завтраки разнообразные,все вкусно.очень дружелюбный персонал.Классный бассейн и тренажерный зал.Беспроводной интернет был всегда.В отеле очень тихо и спокойно.Спасибо персоналу за чудесный отдых! 0.737909
====================11=======================
topic_tri review_text probability_tri
433 11 Прекрасный отдых для любого возраста. Очень понравился отель детям, они смогли заниматься теннисом с прекрасным тренером Davide, конным спортом, что большая редкость, водными лыжами, футболом. Для взрослых есть возможность заняться стрельбой, гольфом, съездить на рыбалку и многим другим. 0.844155
In [ ]:
# df_init.to_parquet(project_root / "data" / "interim" / "LDA_data.parquet")